﻿// See https://aka.ms/new-console-template for more information


namespace Demo
{
    class Program
    {


        //委托
        // 定义一个没有参数，没有返回值的方法
        static void Main1()
        {
            Console.WriteLine("你好");
        }
        // 定义一个接受一个字符串参数，没有返回值的方法
        static void Main2(string name)
        {
            Console.WriteLine($"我叫{name}");
        }
        static void Main5(string name)
        {
            Console.WriteLine($"你们好，我是{name}");
        }
        static void Main6(string name)
        {
            Console.WriteLine($"{name}666666滚出去");
        }
        // 定义一个接受两个整数参数，返回它们和的方法
        static int Main3(int a,int b)
        {
            return a + b;
        }
        // 定义一个接受一个字符串参数，返回其长度的方法
        static int GetStringLength(string text)
        {
            return text.Length;
        }
        static void Main(string[] args)
        {
            Console.WriteLine("委托：");

            // 调用没有参数的方法
            //使用Action 委托可以引用没有参数的方法
            Action main1 = Main1;
            Console.WriteLine("调用没有参数的方法");
            main1();
            // 调用委托
            //使用Action<> 委托可以引用有参数的方法
            Action<string> main2 = Main2;
            Console.WriteLine("调用有参数的方法");
            main2("臭狗熊");
            //Func<T,,,,Result> 委托可以引用有返回值的方法 例如 Func<int,int,int>是两个int参数，加一个int返回值  前面的是参数类型 后面是返回值类型
            Func<int, int, int> main3 = Main3;
            int result = main3(10,5);
            Console.WriteLine($"a+b={result}");
            //Func<T,,,,Result> 委托可以引用有返回值的方法 
            Func<string,int> fun = GetStringLength;//string类型的参数  加一个int类型的返回值
            int length = fun("你好");
            Console.WriteLine($"字符串长度是：{length}");


            //调用多个委托
            //先定义个委托
            Action<string> action ;
            action = Main2;//把Main2加入委托
            action += Main5;//把Main5加入委托
            action += Main6;//把Main6加入委托

            Console.WriteLine($"多个委托 调用如下；");
            action("猫好肥");

            Console.ReadKey();
        }
    }
}


    
